<?php
/**
 * Cookie 类用于表示 HTTP Cookie。
 */
class Cookie {
    /**
     * @var string $name Cookie的名称。
     */
    private string $name;

    /**
     * @var mixed $value Cookie的值。
     */
    private $value = '';

    /**
     * @var mixed Cookie的过期时间或其他选项。
     * 如果为整数，表示Cookie的过期时间（Unix 时间戳）。
     * 如果为数组，可以设置各种Cookie选项，如'secure'、'httponly'等。
     * 默认为0，表示Cookie在会话结束时过期。
     */
    private $expires_or_options = 0;

    /**
     * @var string Cookie的路径。指定可以访问该Cookie的路径。默认为空字符串，表示整个网站都可以访问。
     */
    private string $path = "";

    /**
     * @var string Cookie的域。指定可以访问该Cookie的域。默认为空字符串，表示当前域及其子域可访问。
     */
    private string $domain = "";

    /**
     * Cookie的安全标识常量。
     * 设置Cookie是否仅通过安全连接（HTTPS）传输。如果为true，仅在加密的连接中传输Cookie。
     */
    private bool $secure = false;

    /**
     * @var bool 如果设置为true，Cookie将仅通过HTTP协议传递，而不会通过JavaScript访问。这有助于防止跨站脚本攻击（XSS）。
     */
    private bool $httpOnly = false;

    /**
     * Cookie 构造函数。
     *
     * @param string $name  Cookie的名称。
     * @param mixed $value  Cookie的值。
     */
    public function __construct(string $name, $value = '') {
        $this->name = $name;
        $this->value = $value;
    }

    public function setName(string $name): void
    {
        $this->name = $name;
    }

    /**
     * @param mixed $value
     */
    public function setValue($value): void
    {
        $this->value = $value;
    }

    /**
     * @param int $maxAge 设置最大存活时间
     */
    public function setMaxAge(int $maxAge): void
    {
        if (gettype($this->expires_or_options) === "integer"){
            $this->expires_or_options = $maxAge;
        }else{
            if (!isset($this->expires_or_options)){
                $this->expires_or_options = array();
            }
            $this->expires_or_options['Max-Age'] = $maxAge;
        }
    }

    public function setPath(string $path): void
    {
        $this->path = $path;
    }

    public function setDomain(string $domain): void
    {
        $this->domain = $domain;
    }

    public function setSecure(bool $secure): void
    {
        $this->secure = $secure;
    }

    public function setHttpOnly(bool $httpOnly): void
    {
        $this->httpOnly = $httpOnly;
    }


    /**
     * 获取Cookie的名称。
     *
     * @return string Cookie的名称。
     */
    public function getName(): string {
        return $this->name;
    }

    /**
     * 获取Cookie的值。
     *
     * @return mixed Cookie的值。
     */
    public function getValue() {
        return $this->value;
    }

    /**
     * 获取Cookie的路径。
     *
     * @return string Cookie的路径。
     */
    public function getPath(): string {
        return $this->path;
    }

    /**
     * 获取Cookie的域。
     *
     * @return string Cookie的域。
     */
    public function getDomain(): string {
        return $this->domain;
    }

    /**
     * 检查Cookie是否通过安全连接传输。
     *
     * @return bool 如果Cookie通过安全连接传输，则为true；否则为false。
     */
    public function isSecure(): bool {
        return $this->secure;
    }

    /**
     * 检查Cookie是否标记为HttpOnly。
     *
     * @return bool 如果Cookie标记为HttpOnly，则为true；否则为false。
     */
    public function isHttpOnly(): bool {
        return $this->httpOnly;
    }

    public function setOption(string $key,$value):void{
        if (gettype($this->expires_or_options) === 'integer'){
            $arr = array('Max-Age'=>$this->expires_or_options);
            $this->expires_or_options = $arr;
        }else{
            $this->expires_or_options[$key] = $value;
        }
    }

    public function getOption(string $key){
        if (gettype($this->expires_or_options) === 'integer' && $key === 'Max-Age'){
            return $this->expires_or_options;
        }else{
            return $this->expires_or_options[$key];
        }
    }

    public function getExpires(){
        return $this->expires_or_options;
    }

}


